<?php
/*
 * Class for database interaction
 * @author João Carlos
 * @version 1.0 (16/08/2010)
 */
class MySQL {
	/*
	 * Declaration of class variables(properties)
	 */
	private $host = "localhost"; // Host (Server) running the database
	private $user = "root"; // User connecting to the database server
	private $pass = "root"; // User's password for the database connection
	private $db = "db_pa"; // Name of the database to be used
	private $sql; // String of the SQL query
    private static $instance = false;//atributo que vai armazenar a �nica inst�ncia dessa classe (Padr�o Singleton)
	 
	 //construtor privado
    private function __construct() {
       $this->connect();
       $this->selectDB();
   }
	 
	 //Padr�o singleton para garantir que s� existira uma inst�ncia dessa classe no sistema
    public static function getInstance(){

    if(!MySQL::$instance){
    MySQL::$instance=new MySQL();
    }
      return MySQL::$instance;
    }
		 
	private function connect()
	{
		return mysql_connect($this->host, $this->user, $this->pass) or die($this->erro(mysql_error()));
	}


	private function selectDB()
	{
		return mysql_select_db($this->db) or die($this->erro(mysql_error()));
	}

	/*
	 * Function for database querying
	 * @author João Carlos
	 * @return Object|Boolean Query result or error
	 */
	 //consulta sql de inserção na tabela usuarios
	
	 function insertUser($matricula, $nome, $email, $telefone, $celular, $endereco, $login, $senha)
   {
      	$this->sql = "INSERT INTO Tabela_Usuarios VALUES ('$matricula','$nome','$email', '$telefone', '$celular','$endereco','$login','$senha')";
      	return $this->queryNoDie();
		
   }
  

 
 //sql que add novo tipo de evento a tabela obs: nao add cod_Evento pois esse atributo é auto incrementado no banco
   function insertTypeEvent($nome,$descricao){
      	$this->sql = "INSERT INTO Tipo_Eventos (Nome_Evento,Descricao)  VALUES ('$nome','$descricao')";
       return $this->queryNoDie();
   }
   //sql que add um novo evento a tabela de eventos ocorridos obs: nao add codigo_Evento pois esse atributo é auto incrementado no banco
   function insertEvent($matricula, $codigoEvento,$dataHora ){
	$this->sql = "INSERT INTO Eventos_Ocorridos (Tabela_Usuario_Matricula, Tipo_Eventos_Codigo_Evento, Data_Hora )
    VALUES ('$matricula', '$codigoEvento', '$dataHora')";
	return $this->query();
   }
   
   //SQL que busca todos os usuários no banco
   function select_all_user(){
   $this->sql= "SELECT * FROM Tabela_Usuarios ORDER BY Nome";
	return $this->query();
   }
   
   //SQL que retorna todos os eventos ocorridos por cada usuário
    function select_event_by_user(){
   $this->sql="SELECT * FROM tabela_usuarios join eventos_ocorridos on eventos_ocorridos.tabela_usuarios_matricula=tabela_usuarios.matricula
   join tipo_eventos on tipo_eventos.codigo_evento=eventos_ocorridos.tipo_eventos_codigo_evento  order by tabela_usuarios.Matricula";
	return $this->query();
   }
   
   //relat�rio de eventos ocorridos organizados por tipo de evento
     function select_event_by_type_event(){
   $this->sql = "SELECT * FROM tabela_usuarios JOIN eventos_ocorridos ON eventos_ocorridos.tabela_usuarios_matricula=tabela_usuarios.matricula
   JOIN tipo_eventos ON tipo_eventos.codigo_evento=eventos_ocorridos.tipo_eventos_codigo_evento  ORDER BY tipo_eventos.codigo_evento";
	return $this->query();
   }
   
   //sql que busca todos os eventos em um determinado periodo de tempo as variaveis devem est� no tipo:   'YYYY-MM-DD HH:MM:SS'
   //esse m�todo � capaz de buscar por hora ou por data a depender da forma de us�-lo.
   function select_event_period($date_hour_start, $date_hour_end ){
   //'YYYY-MM-DD HH:MM:SS' //formato do date-time
    $this->sql = "SELECT * FROM tabela_usuarios JOIN eventos_ocorridos ON eventos_ocorridos.tabela_usuarios_matricula=tabela_usuarios.matricula
   JOIN tipo_eventos ON tipo_eventos.codigo_evento=eventos_ocorridos.tipo_eventos_codigo_evento WHERE  eventos_ocorridos.Data_Hora BETWEEN '$date_hour_start' AND '$date_hour_end' 
   ORDER BY eventos_ocorridos.Data_Hora";
	return $this->query();	
   }
   
   
   
   
      function select_all_Type_event(){
   $this->sql= "SELECT * FROM Tipo_Eventos";
	return $this->query();
   }
   
   //SQL que busca usuários no banco pelo nome
    function select_user_name($nome_usuario){
   $this->sql= "SELECT * FROM Tabela_Usuarios WHERE Nome = '$nome_usuario'";
	return $this->query();
   }
   
      //SQL que busca usuários no banco pela matricula
    function select_user_matricula($matricula){
   $this->sql= "SELECT * FROM Tabela_Usuarios WHERE Matricula = '$matricula'";
	return $this->query();
   }
   
      //SQL que busca usuários no banco pelo login
       function select_user_login($login){
       	echo "selecionando...";
   $this->sql= "SELECT * FROM Tabela_Usuarios WHERE Login = '$login'";
	return $this->query();
   }
   

	 function query()
   {
		
      	$qry = mysql_query($this->sql) or die ($this->erro(mysql_error()));
      	return $qry;
   }
   
   function queryNoDie()
   {
        if(mysql_query($this->sql)){
           $qry = 1;
        }
        else{
          $qry = mysql_error();
        }
      	return $qry;
   }

	/*
	 * Function for database fetching
	 * @author Jody Maick
	 * @param String $qry SQL query
	 * @return Object|Boolean Fetched row in the query result or error
	 */
	function fetchObject($qry)
	{
		return mysql_fetch_object($qry);
	}

	
	function fetch($qry)
	{
		return mysql_fetch_array($qry);
	}
	
	
	/*
	 * Function for database fetching directly to an object
	 * @author Jody Maick
	 * @param String $qry SQL query
	 * @param String $class Class name of the destiny object
	 * @return Object|Boolean Fetched row in the query result or error
	 */
	/*function fetchObject($qry, $class)
	 {
		return mysql_fetch_object($qry, $class);
		}*/

	/*
	 * Function for setting values to a class property
	 * @author João Carlos
	 * @param String $prop Property name to be setted
	 * @param mixed Value to be defined
	 */
	function set($prop, $value)
	{
		$this->$prop = $value;
	}

	/*
	 * Function for getting values for a class property
	 * @author João Carlos
	 * @param String $prop Name of class property to be getted
	 * @return mixed Value getted
	 */
	function get($prop)
	{
		return $this->$prop;
	}

	function erro($erro)
	{
		echo $erro;
	}
}
?>
